/* 
    Document   : main
    Created on : Dec 14, 2013, 4:00:40 PM
    Author     : Evgeniy Grigorevskiy
    Description:
        Purpose of the stylesheet follows.
 */

var $j = jQuery.noConflict();

$j(document).ready(function(){
    
    
    /*Here all functional for all elements of the page let's start =)*/

    // ------->      
    /*variables with self-described name*/
    
    // Servlet-controller URL 
    var servletUrl = "Controller";
    // AJAX JSP page for html code migration
    var ajaxPage= "ajaxAll.jsp";
    // amount of books for displaying .. by default=10 for grid view
    var booksAmount=10;
    var booksAmountOnCurrentPage=10;
    // number of current page .. by default 1-st page...
    var currentPage=1;
    // for splitting server responses
    var splitting = ";DAO;";
    // filters for displaying
    var filterOne = "new";
    var filterTwo = "all genres";
    // request types
    var libraryType = "global";
    var libraryRequest="getGlobalLibrary";
    // ------->       
    /*Functions witch was used more than 1 time*/
    // md5 function
    function MD5 (string) {

        function RotateLeft(lValue, iShiftBits) {
            return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
        }

        function AddUnsigned(lX,lY) {
            var lX4,lY4,lX8,lY8,lResult;
            lX8 = (lX & 0x80000000);
            lY8 = (lY & 0x80000000);
            lX4 = (lX & 0x40000000);
            lY4 = (lY & 0x40000000);
            lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
            if (lX4 & lY4) {
                return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
            }
            if (lX4 | lY4) {
                if (lResult & 0x40000000) {
                    return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
                } else {
                    return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
                }
            } else {
                return (lResult ^ lX8 ^ lY8);
            }
        }

        function F(x,y,z) {
            return (x & y) | ((~x) & z);
        }
        function G(x,y,z) {
            return (x & z) | (y & (~z));
        }
        function H(x,y,z) {
            return (x ^ y ^ z);
        }
        function I(x,y,z) {
            return (y ^ (x | (~z)));
        }

        function FF(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

        function GG(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

        function HH(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

        function II(a,b,c,d,x,s,ac) {
            a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
            return AddUnsigned(RotateLeft(a, s), b);
        };

        function ConvertToWordArray(string) {
            var lWordCount;
            var lMessageLength = string.length;
            var lNumberOfWords_temp1=lMessageLength + 8;
            var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
            var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
            var lWordArray=Array(lNumberOfWords-1);
            var lBytePosition = 0;
            var lByteCount = 0;
            while ( lByteCount < lMessageLength ) {
                lWordCount = (lByteCount-(lByteCount % 4))/4;
                lBytePosition = (lByteCount % 4)*8;
                lWordArray[lWordCount] = (lWordArray[lWordCount] | (string.charCodeAt(lByteCount)<<lBytePosition));
                lByteCount++;
            }
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
            lWordArray[lNumberOfWords-2] = lMessageLength<<3;
            lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
            return lWordArray;
        };

        function WordToHex(lValue) {
            var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
            for (lCount = 0;lCount<=3;lCount++) {
                lByte = (lValue>>>(lCount*8)) & 255;
                WordToHexValue_temp = "0" + lByte.toString(16);
                WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
            }
            return WordToHexValue;
        };

        function Utf8Encode(string) {
            string = string.replace(/\r\n/g,"\n");
            var utftext = "";

            for (var n = 0; n < string.length; n++) {

                var c = string.charCodeAt(n);

                if (c < 128) {
                    utftext += String.fromCharCode(c);
                }
                else if((c > 127) && (c < 2048)) {
                    utftext += String.fromCharCode((c >> 6) | 192);
                    utftext += String.fromCharCode((c & 63) | 128);
                }
                else {
                    utftext += String.fromCharCode((c >> 12) | 224);
                    utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                    utftext += String.fromCharCode((c & 63) | 128);
                }

            }

            return utftext;
        };

        var x=Array();
        var k,AA,BB,CC,DD,a,b,c,d;
        var S11=7, S12=12, S13=17, S14=22;
        var S21=5, S22=9 , S23=14, S24=20;
        var S31=4, S32=11, S33=16, S34=23;
        var S41=6, S42=10, S43=15, S44=21;

        string = Utf8Encode(string);

        x = ConvertToWordArray(string);

        a = 0x67452301;
        b = 0xEFCDAB89;
        c = 0x98BADCFE;
        d = 0x10325476;

        for (k=0;k<x.length;k+=16) {
            AA=a;
            BB=b;
            CC=c;
            DD=d;
            a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
            d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
            c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
            b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
            a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
            d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
            c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
            b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
            a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
            d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
            c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
            b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
            a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
            d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
            c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
            b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
            a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
            d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
            c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
            b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
            a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
            d=GG(d,a,b,c,x[k+10],S22,0x2441453);
            c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
            b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
            a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
            d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
            c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
            b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
            a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
            d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
            c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
            b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
            a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
            d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
            c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
            b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
            a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
            d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
            c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
            b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
            a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
            d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
            c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
            b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
            a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
            d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
            c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
            b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
            a=II(a,b,c,d,x[k+0], S41,0xF4292244);
            d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
            c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
            b=II(b,c,d,a,x[k+5], S44,0xFC93A039);
            a=II(a,b,c,d,x[k+12],S41,0x655B59C3);
            d=II(d,a,b,c,x[k+3], S42,0x8F0CCC92);
            c=II(c,d,a,b,x[k+10],S43,0xFFEFF47D);
            b=II(b,c,d,a,x[k+1], S44,0x85845DD1);
            a=II(a,b,c,d,x[k+8], S41,0x6FA87E4F);
            d=II(d,a,b,c,x[k+15],S42,0xFE2CE6E0);
            c=II(c,d,a,b,x[k+6], S43,0xA3014314);
            b=II(b,c,d,a,x[k+13],S44,0x4E0811A1);
            a=II(a,b,c,d,x[k+4], S41,0xF7537E82);
            d=II(d,a,b,c,x[k+11],S42,0xBD3AF235);
            c=II(c,d,a,b,x[k+2], S43,0x2AD7D2BB);
            b=II(b,c,d,a,x[k+9], S44,0xEB86D391);
            a=AddUnsigned(a,AA);
            b=AddUnsigned(b,BB);
            c=AddUnsigned(c,CC);
            d=AddUnsigned(d,DD);
        }

        var temp = WordToHex(a)+WordToHex(b)+WordToHex(c)+WordToHex(d);

        return temp.toLowerCase();
    }
    // Universal function for displaying hide blocks
    function showHideBlock(nameOfHideBlock){
        $j(nameOfHideBlock).fadeIn();
    }
    // Universal function for hiding secret blocks=)
    function hideHideBlock(nameOfHideBlock){
        $j(nameOfHideBlock).fadeOut();
    }
    function parsePostParameters(parameters){
        var postParameters="";
        for (var i=0;i<parameters.length-1;i++){
            postParameters=postParameters+parameters[i]+";JS;"
        }
        postParameters=postParameters+parameters[parameters.length-1];

        return postParameters;
    }

    // Posting information for servlet-controller
    function postToServlet(whatType, params, callBackFunction, errorMsg){   //if no callback function - put "none"
        $j.post(servletUrl, {
            type: whatType,
            parameters: params
        }, function (data){
            //alert('BackForDebbuging: '+data);
            if (data != "failed"){
                if (callBackFunction=="none"){
                    return data;
                } else {
                    callBackFunction(data);
                } 
            } else {
                showMsg(errorMsg);
            }
        });
    }
    // getting books from server
    function getBooksContent(requestType,libType,page, amountOfBooks, filterOneValue, filterTwoValue){  //in progress
        var params = [page, amountOfBooks, filterOneValue, filterTwoValue];
        $j.post(servletUrl, {
            type: requestType,
            parameters: parsePostParameters(params)
        }, function (data){
              
            if (data != "failed"){
                var BooksArray = data.split(splitting);
                $j('#contentWrapper').html('<img id="preload" src ="img/preloader.GIF"/> <div class="clear"></div>');
                booksAmountOnCurrentPage=BooksArray.length;
                for (var i=0; i<BooksArray.length;i++){
                    try{
                        var book = JSON.parse(BooksArray[i]);
                    
                        var totalVotes= book.sumRating;
                        var mark1=0, mark2=0, mark3=0, mark4=0, mark5=0;
                        var mark1Length=0, mark2Length=0, mark3Length=0, mark4Length=0, mark5Length=0;
                        if (totalVotes!=0){
                            if (book.voteFor5!=undefined){
                                mark5=book.voteFor5;
                                mark5Length=Math.round(book.voteFor5/totalVotes*75);
                            }
                            if (book.voteFor4!=undefined){
                                mark4=book.voteFor4;
                                mark4Length=Math.round(book.voteFor4/totalVotes*75);
                            }
                            if (book.voteFor3!=undefined){
                                mark3=book.voteFor3;
                                mark3Length=Math.round(book.voteFor3/totalVotes*75);
                            }
                            if (book.voteFor2!=undefined){
                                mark2=book.voteFor2;
                                mark2Length=Math.round(book.voteFor2/totalVotes*75);
                            }
                            if (book.voteFor1!=undefined){
                                mark1=book.voteFor1;
                                mark1Length=Math.round(book.voteFor1/totalVotes*75);
                            }
                        }
                        $j('#contentWrapper').append(
                            '<div class="bookDisplay" style="display: none">' 
                            +   '<div class="leftBookDisplay" id="book'+book.ISBN+'"> '                       
                            +   '<div class="image"><img src="'+ book.image+'"/></div>'
                     
                            +   '<div class="rating">'

                            +   '<ul class="voting" id="'+book.ISBN+'">'
                            +   '<li class="half" id="0.5"><a>0.5</a></li>'
                            +   '<li class="one" id="1"><a>1</a></li>'
                            +   '<li class="oneAndHalf" id="1.5"><a>1.5</a></li>'
                            +   '<li class="two" id="2"><a>2</a></li>'
                            +   '<li class="twoAndHalf" id="2.5"><a>2.5</a></li>'
                            +   '<li class="three" id="3"><a>3</a></li>'
                            +   '<li class="threeAndHalf" id="3.5"><a>3.5</a></li>'
                            +   '<li class="four" id="4"><a>4</a></li>'
                            +   '<li class="fourAndHalf" id="4.5"><a>4.5</a></li>'
                            +   '<li class="five" id="5"><a>5</a></li>'
                            +   '</ul>'
                            +   '</div>'
                     
                            +   '<div class="TotalVotes">Voted: <span id="TotalVotes">' + book.sumRating +'</span></div>'
                            +   '<div class="YourVote">Your vote: <span id="userVote">'+book.currentUserScore+'</span></div>'
                            +   '<div class="rating5">'
                            +   '<div class="mark">5</div>'
                            +   '<div class="progressBarBackFone"><div class="progressBar" style="width:'+mark5Length+'px"></div></div>'
                            +   '<div class="totalVotesForEach">'+mark5+'</div>'
                            +   '</div>'
                            +   '<div class="rating4">'
                            +   '<div class="mark">4</div>'
                            +   '<div class="progressBarBackFone"><div class="progressBar" style="width:'+mark4Length+'px"></div></div>'
                            +   '<div class="totalVotesForEach">'+mark4+'</div>'
                            +   '</div>'
                            +   '<div class="rating3">'
                            +   '<div class="mark">3</div>'
                            +   '<div class="progressBarBackFone"><div class="progressBar" style="width:'+mark3Length+'px"></div></div>'
                            +   '<div class="totalVotesForEach">'+mark3+'</div>'
                            +   '</div>'
                            +   '<div class="rating2">'
                            +   '<div class="mark">2</div>'
                            +   '<div class="progressBarBackFone"><div class="progressBar" style="width:'+mark2Length+'px"></div></div>'
                            +   '<div class="totalVotesForEach">'+mark2+'</div>'
                            +   '</div>'
                            +   '<div class="rating1">'
                            +   '<div class="mark">1</div>'
                            +   '<div class="progressBarBackFone"><div class="progressBar" style="width:'+mark1Length+'px"></div></div>'
                            +   '<div class="totalVotesForEach">'+mark1+'</div>'
                            +   '</div>'
                            +   '</div>'
              
                            +   '<div class="title">Title: '+ book.title +'</div>'
                            +   '<div class="authors">by '+ book.authors.substring(0, book.authors.length-1) +'</div>'
                            +   '<div class="descp">Description: '+ book.description +'</div>'
                            +   '<div class="isbn">ISBN: '+book.ISBN+'</div>'
                            +   '<div class="userActionsWithBooks" id="'+book.ISBN+'s">'
                            +   '<select class="paddingListForBooks">'
                            +   '<option value="new">new</option>'
                            +   '<option value="planned to read">planned to read</option>'
                            +   '<option value="now reading">now reading</option>'
                            +   '<option value="finished">finished</option>'
                            +   '</select>'
                            +   '</div> '
                            + '</div>'
                            );
            
            
                        if (libType == "global"){
                            $j('.userActionsWithBooks').html('<div class="addBookToLocal">Add Book</div>');
                        } else {
                            $j('#'+book.ISBN+'s select [value=\''+book.readStatus+'\']').attr("selected", "selected");
                        }
                        if (libType == "publication"){
                            $j('.userActionsWithBooks').html('<select class="paddingListForBooks">'
                                +'<option value="inProgress" disabled selected>In progress</option>'
                                +'<option value="toPublish">Publish</option>'
                                +'<option value="reject">Reject</option>'
                                +'</select>');
                        }
                        var avgVote;
                        switch (Math.round(book.avgRating*2)/2){
                            case 0.5:
                                avgVote=" .half ";
                                break;
                                
                            case 1:
                                avgVote=" .one ";
                                break;
                                
                            case 1.5:
                                avgVote=" .oneAndHalf ";
                                break;
                            case 2:
                                avgVote=" .two ";
                                break;
                            case 2.5:
                                avgVote=" .twoAndHalf ";
                                break;
                            case 3:
                                avgVote=" .three ";
                                break;
                            case 3.5:
                                avgVote=" .threeAndHalf ";
                                break;
                            case 4:
                                avgVote=" .four ";
                                break;
                            case 4.5:
                                avgVote=" .fourAndHalf ";
                                break;
                            case 5:
                                avgVote=" .five ";
                                break;
                            default:
                                avgVote="no rating";
                        }
                        $j('#'+book.ISBN+' li a').attr('class','');
                        if (avgVote!="no rating"){
                            $j('#'+book.ISBN+avgVote+' a').addClass("cur");
                        }
                    } catch (exception){
                        showMsg("smth wrong with JSON parse! Books length: BooksArray[i].length");
                    }
                }  
                $j(".bookDisplay").css("display","block");
                $j("#preload").css("display","none");
                if(BooksArray.length==0){
                    $j('#contentWrapper').html("No books found");
                }
            } else {
                $j('#contentWrapper').html("No books found");
            }
        });
    }
    
    // Mb some helping functions (validation, cleaning fields and so on) witch make code more readable
    
    // clear input fields by an array of their names
    function clearInputs(names){    //use an array!!!
        for (i=0; i<names.length;i++){
            $j(names[i]).val("");
        }
    }
    
    // Function for checking registration fields...
    function checkInputsRegistration(){
        var error="E-mail is incorrect. Try again!";
        
        var lengthIncorrectForFirst2Fields=true, lengthIncorrectForLast2Fields=true;
        var passAndConfPassMissmatched=true, eMailIncorrect=true, tooShortPass=true;
        
        /*e-mail validation*/
        
        var reg = new RegExp("[0-9a-z_]+@[0-9a-z_^.]+\\.[a-z]{2,3}", 'i');
        if (!reg.test($j('#eMail').val())) {
            eMailIncorrect=false;
        }
        //checking length of input names
        if ($j('#login').val().length <= 0 ||  $j('#firstName').val().length <= 0){
            lengthIncorrectForFirst2Fields=false;
            error="notAllFields";
        }
        if ($j('#lastName').val().length <= 0 || $j('#eMail').val().length <= 0){
            lengthIncorrectForLast2Fields=false;
            error="notAllFields";
        }
        //checking equality of input passwords
        if ($j('#password').val() != $j('#confirmPassword').val()){
            passAndConfPassMissmatched=false;
            error='password and confirmed password fields are missmatch!';
        }
        //checking 
        if ($j('#password').val().length <= 5){
            tooShortPass=false;
            error='Too short password';
        }
         
        checkInputsRegistration.getError=function(){
            return error;
        }
        var result= lengthIncorrectForFirst2Fields && lengthIncorrectForLast2Fields;
        result = result && passAndConfPassMissmatched && eMailIncorrect && tooShortPass;
        if (result){
            return true;
        } else {
            return false;
        }
    }
    //close anyWay
    function toCloseInaFewWays(hiddenBlockClass, innerBlockClass, closeButtonID){
        //exit with Cancel button on form
        $j(document).on('click','#'+closeButtonID,function(){
            hideHideBlock('.'+hiddenBlockClass);
        });
        //exit with Esc button
        $j(document).on('keydown','.'+hiddenBlockClass, function(event){
            if (event.which == 27){
                hideHideBlock('.'+hiddenBlockClass);
            }
        });
        //exit with click on black form                                    in progress !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
        $j(document).on('click','.'+hiddenBlockClass, function(){
            hideHideBlock('.'+hiddenBlockClass);
        }); 
        $j(document).on('click','.'+innerBlockClass, function(event){
            //nothing happens if we click on white form for registration=) It must be so)   
            if (event.stopPropagation) {
                // For normal browsers...
                event.stopPropagation()
            } else {
                // For IE...
                event.cancelBubble = true
            }
        });
    }
    //if some error or notifications happens...
    function showMsg(text){
        $j('#forFocusing').focus();
        $j('.errorMsg').html(text);
        $j('.errorListBlock').fadeIn();
        $j(document).on('keydown','.errorListForm', function(event){
            if (event.which == 13){
                $j('.errorListBlock').fadeOut();
            }
        });
        toCloseInaFewWays('errorListBlock','errorListForm','closeErrorListButton');
    }
    
    //temporary gag
    function IP(){ 
        showMsg('In progress... It will work soon! Thanks for understanding and have a nice day=)');
    } 
        
    // ------->   
    /*Functions for elements on the page*/
   
    //--> Search for ISBN
    $j(document).on('click', '.imgSearchButton', function(){
        if($j('#search').val().length>0){
            getBooksContent("isbnSearch","global", $j('#search').val(), "booksAmount", "filterOne", "filterTwo");
        }
        
    });
    $j(document).on('keydown','#search', function(event){
        if (event.which == 13){
            if($j('#search').val().length>0){
                getBooksContent("isbnSearch","global", $j('#search').val(), "booksAmount", "filterOne", "filterTwo");
            }
        }
    });
    
    //--> Registration - validation and posting to server information...
    
    // if negative responce from server
    var regError = "User with this login or email is already exist!";

    $j(document).on('click', '#registrationButton', function(){
        showHideBlock('.registrationBlock');
        clearInputs(['#login','#password','#firstName','#lastName','#eMail','#confirmPassword']);
        $j('#login').focus();
    });
    
    toCloseInaFewWays('registrationBlock','registrationForm','CancelRegistration');

    $j(document).on('click', '#toCompleteRegistrationButton', function(){
        if (checkInputsRegistration()){
            var params = [$j('#login').val(), MD5($j('#password').val()), $j('#firstName').val(), $j('#lastName').val(), $j('#eMail').val()];
            postToServlet("registration", parsePostParameters(params), "none", regError);
            hideHideBlock('.registrationBlock');
        } else {
            showMsg(checkInputsRegistration.getError());          
        }
    });
    
    $j(document).on('keydown','.registrationForm', function(event){
        if (event.which == 13){
            if (checkInputsRegistration()){
                var params = [$j('#login').val(), MD5($j('#password').val()), $j('#firstName').val(), $j('#lastName').val(), $j('#eMail').val()];
                postToServlet("registration", parsePostParameters(params), "none", regError);
                hideHideBlock('.registrationBlock');
            } else {
                showMsg(checkInputsRegistration.getError());          
            }
        }
    });
    
    //--> Login
    var loginError= 'Wrong username or password!';
    
    function loadLoggedIn (dataNoSplit){
        var getData = dataNoSplit.split(splitting);

        $j.get("ajaxAll.jsp", function(data) {
            data = $j(data);
            //load logout form
            $j(".signIn").html($j('#logOut', data).html());
            $j('#UserFirstNameToMeet').html(getData[1]);
            //load Local/Global Switcher
            $j(".librarySwitch").html($j('.librarySwitcherOthers', data).html());
        //load books content
        });
        switch (getData[0]){
            //beginner
            case "5":
                $j.get("ajaxAll.jsp", function(data) {
                    //loading beginner top menu
                    $j('#topMenu').attr('class','');
                    $j('#topMenu').addClass('beginner');
                    data = $j(data);
                    $j("#topMenu").html($j('.beginnerTopMenu', data).html());
                });
                break;
            //advanced
            case "6":
                $j.get("ajaxAll.jsp", function(data) {
                    //loading beginner top menu
                    $j('#topMenu').attr('class','');
                    $j('#topMenu').addClass('advanced');
                    data = $j(data);
                    $j("#topMenu").html($j('.advancedTopMenu', data).html());
                });
                break;
            //moderator
            case "7":
                $j.get("ajaxAll.jsp", function(data) {
                    //loading beginner top menu
                    $j('#topMenu').attr('class','');
                    $j('#topMenu').addClass('moderator');
                    data = $j(data);
                    $j("#topMenu").html($j('.moderatorTopMenu', data).html());
                });
                break;
            default:
                showMsg("Some unexpected error...");
        }
    }
    
    $j(document).on('click', '.signInButton', function(){
        if ($j('#username').val().length>0 && $j('#pass').val().length>0){
            var params = [$j('#username').val(), MD5($j('#pass').val())];
            postToServlet("login",parsePostParameters(params), loadLoggedIn, loginError);
        }else{
            showMsg('Please, enter name or password!');
        }
    });
    $j(document).on('keydown','.signIn', function(event){
        if (event.which == 13){
            if ($j('#username').val().length>0 && $j('#pass').val().length>0){
                var params = [$j('#username').val(), MD5($j('#pass').val())];
                postToServlet("login",parsePostParameters(params), loadLoggedIn, loginError);
            }else{
                showMsg('Please, enter name or password!');
            }
        } 
    });
    //--> Logout - mb redirect with deleting coockies and session .. and there is no troubles =)
    $j(document).on('click', '#logOutButton', function(){
        function easyWayToLogOut(someArg){
            location.reload();
        }
        postToServlet("logout",null,easyWayToLogOut,"none");
    });
    
    // Search filters ... Mb try to connect it with ISBN search in some way...
   
    // -->Adding book
    $j(document).on('click', '#addBookButtonMain', function(){
        showHideBlock('.addBooksBlock');
        $j('#ISBN').focus();
        clearInputs(['#ISBN']);
    });
    
    toCloseInaFewWays('addBooksBlock','addBooksForm','CancelBook');
  
    var googleBooksUrl = "GoogleBooks";
    $j(document).on('click', '#AddBook', function(){

        if ($j('#ISBN').val().length>9){
            var isbnValue = $j('#ISBN').val().replace("-","");
            
            $j.get(googleBooksUrl, {
                isbn: isbnValue
            }, function (notParsedRecvObject){
                try{
                    
                    var recvObject= JSON.parse (notParsedRecvObject);
                    var params = [recvObject.items[0].volumeInfo.industryIdentifiers[1].identifier, recvObject.items[0].volumeInfo.title, recvObject.items[0].volumeInfo.authors, 
                    recvObject.items[0].volumeInfo.description, recvObject.items[0].volumeInfo.pageCount,
                    recvObject.items[0].volumeInfo.imageLinks.thumbnail, $j("#genreAddingBooks option:selected").val()];
                    
                    postToServlet("addingNewBookToGlobal",parsePostParameters(params), "none", "Added to your local library");
                } catch(exception){
                    showMsg('Can\'t get this book from google books');
                }
                hideHideBlock('.addBooksBlock');
            });
        }
    });
    //--> Local/Global switchers and books for publication
    $j(document).on('click', '#localLibraryActive', function(){
        $j('#localLibraryActive').attr('class','');
        $j('#localLibraryActive').addClass('localLibraryActive');
        $j('#globalLibraryActive').attr('class','');
        libraryType="local";
        libraryRequest="getLocalLibrary";
        currentPage=1;
        getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
    });
    $j(document).on('click', '#globalLibraryActive', function(){
        $j('#globalLibraryActive').attr('class','');
        $j('#globalLibraryActive').addClass('globalLibraryActive');
        $j('#localLibraryActive').attr('class','');
        libraryType="global";
        libraryRequest="getGlobalLibrary";
        currentPage=1;
        getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
    });
    // books for publication view
    $j(document).on('click', '#forPublicationBooksButton',function(){
        $j('#localLibraryActive').attr('class','');
        libraryType="publication";
        libraryRequest="getPublishLibraryUser";
        currentPage=1;
        getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
    });
    $j(document).on('click', '#forPublicationBooksGuestButton',function(){
        $j('#localLibraryActive').attr('class','');
        libraryType="publication";
        libraryRequest="getPublishLibraryGuests";
        currentPage=1;
        getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
    });
    //--> Add book to local library from global
    function checkresult(result){
        if (result!="success"){
            showMsg(result);
        }
    }
    $j(document).on('click','.addBookToLocal', function(){
        var isbn=$j(this).parent().attr('id').substring(0, $j(this).parent().attr('id').length-1);
        postToServlet("addBookToLocal",isbn,checkresult,"Please, login first!");
    });
    //-->Filters
    $j('#filterOne li a').each(function(){
        $j(this).click(function(){
            $j('#filterOne li a').attr('class','');
            $j(this).addClass('currentFilterValue');
            filterOne = $j(this).attr('id');
            getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
        });
    });
    $j('#filterTwo li a').each(function(){
        $j(this).click(function(){
            $j('#filterTwo li a').attr('class','');
            $j(this).addClass('currentFilterValue');
            filterTwo=$j(this).attr('id');

            getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
        });
    });
   
    //--> Publish book from local library to global
    $j(document).on('click', '#publishBookButton', function(){
        showHideBlock('.publishBlock');
        clearInputs(['#isbnForPublish']);
        $j('#isbnForPublish').focus();
    });
    
    toCloseInaFewWays('publishBlock','publishForm','CancelPublishBook');
    
    $j(document).on('click', '#toCompletePublishBookButton', function(){
        if ($j('#isbnForPublish').val().length>9){
            var params = [$j('#isbnForPublish').val().replace("-","")];
            postToServlet("publishBook", parsePostParameters(params), "none", "Please, enter ISBN correctly");
            hideHideBlock('.publishBlock');
        } else {
            showMsg("Please, enter an ISBN correctly!");          
        }
    });
    
    $j(document).on('keydown','.publishForm', function(event){
        if (event.which == 13){
            if ($j('#isbnForPublish').val().length>9){
                var params = [$j('#isbnForPublish').val().replace("-","")];
                postToServlet("publishBook", parsePostParameters(params), "none", "Please, enter ISBN correctly");
                hideHideBlock('.publishBlock');
            } else {
                showMsg("Please, enter an ISBN correctly!");          
            }
        }
    });
    //--> Delete book from local library
    $j(document).on('click', '#deleteBookButton', function(){
        showHideBlock('.deleteBlock');
        clearInputs(['#isbnForDelete']);
        $j('#isbnForDelete').focus();
    });
   
   toCloseInaFewWays('deleteBlock','deleteForm','CancelDeletingBook');
                
    $j(document).on('click', '#toCompleteDeletingBookButton', function(){
        if ($j('#isbnForDelete').val().length>9){
            var params = [$j('#isbnForDelete').val().replace("-","")];
            postToServlet("deleteBook", parsePostParameters(params), "none", "Please, enter ISBN correctly");
            hideHideBlock('.deleteBlock');
            if (libraryType=="local"){
                getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
            }
        } else {
            showMsg("Please, enter an ISBN correctly!");          
        }
    });
    
    $j(document).on('keydown','.deleteForm', function(event){
        if (event.which == 13){
            if ($j('#isbnForDelete').val().length>9){
                var params = [$j('#isbnForDelete').val().replace("-","")];
                postToServlet("deleteBook", parsePostParameters(params), "none", "Please, enter ISBN correctly");
                hideHideBlock('.deleteBlock');
            } else {
                showMsg("Please, enter an ISBN correctly!");          
            }
        }
    });
    
    // -->Ban user 
    $j(document).on('click', '#userBanButton', function(){
        showHideBlock('.banUserBlock');
        clearInputs(['#userLoginForBan', '#userEmailForBan']);
        $j('#userLoginForBan').focus();
    });
    
    toCloseInaFewWays('banUserBlock','banUserForm','CancelBanUserBook');
                
    $j(document).on('click', '#toCompleteBanUserButton', function(){
        IP();
            /*
            if ($j('#userLoginForBan').val().length>0 || $j('#userEmailForBan').val().length>0){
                var params;
                if ($j('#userLoginForBan').val().length>0){
                    params = [$j('#userLoginForBan').val()];
                } else {
                    params = [$j('#userEmailForBan').val()];
                }
                postToServlet("banUser", parsePostParameters(params), "none", "Please, enter ISBN correctly");
                hideHideBlock('.banUserBlock');
            } else {
                showMsg("Please, enter one of this fields!");          
            }*/
    });
    
    $j(document).on('keydown','.banUserForm', function(event){
        if (event.which == 13){
            IP();
            /*
            if ($j('#userLoginForBan').val().length>0 || $j('#userEmailForBan').val().length>0){
                var params;
                if ($j('#userLoginForBan').val().length>0){
                    params = [$j('#userLoginForBan').val()];
                } else {
                    params = [$j('#userEmailForBan').val()];
                }
                postToServlet("banUser", parsePostParameters(params), "none", "Please, enter ISBN correctly");
                hideHideBlock('.banUserBlock');
            } else {
                showMsg("Please, enter one of this fields!");          
            }*/
        }
    });
    
    // -->Pagination: previous and next pages .. displaying current page
    $j('#left').click(function(){
        if (currentPage>1){
            currentPage--;
            getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
            $j('#currentPage').html(currentPage);
        }
    });
    
    $j('#right').click(function(){
        if (booksAmountOnCurrentPage==10 || booksAmountOnCurrentPage==20){
            currentPage++;
            getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
            $j('#currentPage').html(currentPage);
        }
    });

    //--> Change views
    $j(document).on('click', '#gridButton', function(){
        if (booksAmount==10){
            $j('#content').attr('class','');
            $j('#content').addClass('grid');
        } else {
            booksAmount=10;
            getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
            $j('#content').attr('class','');
            $j('#content').addClass('grid');
        }
    });
    $j(document).on('click', '#smallListButton', function(){
        if (booksAmount==20){
            $j('#content').attr('class','');
            $j('#content').addClass('smallList');
        } else {
            booksAmount=20;
            getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
            $j('#content').attr('class','');
            $j('#content').addClass('smallList');
        }
    });
    $j(document).on('click', '#bigListButton', function(){
        if (booksAmount==10){
            $j('#content').attr('class','');
            $j('#content').addClass('bigList');
        } else {
            booksAmount=10;
            getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
            $j('#content').attr('class','');
            $j('#content').addClass('bigList');
        }
    });
    //--> changing book status in local library
    $j(document).on('change','.paddingListForBooks',function(){
        var isbn=$j(this).parent().attr('id').substring(0, $j(this).parent().attr('id').length-1);
        //alert("ISBN: "+isbn+" and option: "+$j(".paddingListForBooks option:selected").val());
        // isbn and new status...
        var params = [isbn, $j(".paddingListForBooks option:selected").val()];
        switch (libraryType){
            case 'local':
                postToServlet("changeStatusLocalLibrary", parsePostParameters(params), "none", "Please, login first!");
                break;
            case 'publication':
                postToServlet("changeStatusPublicationBook", parsePostParameters(params), "none", "Please, login first!");
                break;
            default:
                showMsg('Error... LibraryType not found! Please, contact to support with this error!');
        }
    });
    // email notifications
    $j('.signUpButton').click(function(){
        IP();
        /*var reg = new RegExp("[0-9a-z_]+@[0-9a-z_^.]+\\.[a-z]{2,3}", 'i');
        if(!reg.test($j('#subscript').val())){
            showMsg('e-mail incorrect');
        }
        if($j('#subscript').val().length>0){
            var params = [$j("#subscript").val()];
            postToServlet("emailSubscription", parsePostParameters(params), "none", "No connection with server");
        } else {
            showMsg('Please, enter e-mail correctly!')
        }*/
    });
    // Footer information...
    
    //changing marks on view for voting
    function changeClientMark(dummy){
        showMsg("Thanks for your voting!");
        var totalVotes=$j("#book"+isbn+" .TotalVotes #TotalVotes").text();
        var avg=$j('#'+isbn+' li .cur').parent().attr('id');
        if (avg===undefined){
            avg=0;
        }
        
        var newRating=0;
        var userPreviousVote=$j("#book"+isbn+" .YourVote #userVote").text();
        
        if (userPreviousVote==0){
            newRating=Math.round((Number(avg)*Number(totalVotes)+mark)/(Number(totalVotes)+1)*2)/2;
            $j("#book"+isbn+" .YourVote #userVote").html(mark);
            totalVotes++;
            $j("#book"+isbn+" .TotalVotes #TotalVotes").html(totalVotes);
        } else {
            newRating=Math.round((Number(avg)*Number(totalVotes)-Number(userPreviousVote)+mark)/(Number(totalVotes))*2)/2;
            $j("#book"+isbn+" div .userVote").html(mark);
        }
        switch (newRating){
            case 0.5:
                newRating=" .half ";
                break;                
            case 1:
                newRating=" .one ";
                break;               
            case 1.5:
                newRating=" .oneAndHalf ";
                break;
            case 2:
                newRating=" .two ";
                break;
            case 2.5:
                newRating=" .twoAndHalf ";
                break;
            case 3:
                newRating=" .three ";
                break;
            case 3.5:
                newRating=" .threeAndHalf ";
                break;
            case 4:
                newRating=" .four ";
                break;
            case 4.5:
                newRating=" .fourAndHalf ";
                break;
            case 5:
                newRating=" .five ";
                break;
            default:
                newRating="no rating";
        }
        $j('#'+isbn+' li a').attr('class','');
        if (newRating!="no rating"){
            $j('#'+isbn+newRating+' a').addClass("cur");
        }
    }
    // voting user
    $j(document).on('click','.voting li a',function(){
        var mark=Math.round($j(this).parent().attr('id'));
        var isbn=$j(this).parent().parent().attr('id');
        
        var params = [isbn, mark];
        postToServlet("userVoted", parsePostParameters(params), changeClientMark, "Please, login first!");
    });
    // Profile actions -> for what ??? mb for vk users .. with asking them to edit their e-mail ...
        
    // Reports: i don't remember what type of reports must be .. so I'll find out it later
    
    
    
    //  -> Admin's funny functional... Mb make another .jsp like: techSupport.jsp and make login page first... And one more JS
    // 0. Login Banner first and don't display anything more
    // 1. If all right - load admins page
    // 2. Reports and ban functions, Deleting and approving publication some books to global library -> load from this script
    // 3. Make unban users
    // 4. Adding new users
    // 5. Changing role of a user
    // 6. Deleting users
    // 7. Mailing users from our site
    // 8. Mb some more functions ( witch I've missed or forgotten
    //
    
    /*on page loading*/
    $j.post(servletUrl, {
        type: "onPageLoad"  
    }, function (dataNoSplit){
        //loading books content
        getBooksContent(libraryRequest,libraryType, currentPage, booksAmount, filterOne, filterTwo);
        var getData = dataNoSplit.split(splitting);
        if (getData[0]=="4"){
            //load guest page
            $j.get("ajaxAll.jsp", function(data) {
                //loading beginner top menu
                $j('#topMenu').attr('class','');
                $j('#topMenu').addClass('guest');
                data = $j(data);
                $j("#topMenu").html($j('.guestTopMenu', data).html());
                //load logout form
                $j(".signIn").html($j('#loginBack', data).html());
                //load Local/Global Switcher
                $j(".librarySwitch").html($j('.librarySwitcherGuest', data).html());

            });
        } else {
            //load all other and role topBanner
            $j.get("ajaxAll.jsp", function(data) {
                data = $j(data);
                //load logout form
                $j(".signIn").html($j('#logOut', data).html());
                alert(getData[1]);
                $j('#UserFirstNameToMeet').html(getData[1]);
                //load Local/Global Switcher
                $j(".librarySwitch").html($j('.librarySwitcherOthers', data).html());
            });
            switch (getData[0]){
                //beginner
                case "5":
                    $j.get("ajaxAll.jsp", function(data) {
                        //loading beginner top menu
                        $j('#topMenu').attr('class','');
                        $j('#topMenu').addClass('beginner');
                        data = $j(data);
                        $j("#topMenu").html($j('.beginnerTopMenu', data).html());
                    });
                    break;
                //advanced
                case "6":
                    $j.get("ajaxAll.jsp", function(data) {
                        //loading beginner top menu
                        $j('#topMenu').attr('class','');
                        $j('#topMenu').addClass('advanced');
                        data = $j(data);
                        $j("#topMenu").html($j('.advancedTopMenu', data).html());
                    });
                    break;
                //moderator
                case "7":
                    $j.get("ajaxAll.jsp", function(data) {
                        //loading beginner top menu
                        $j('#topMenu').attr('class','');
                        $j('#topMenu').addClass('moderator');
                        data = $j(data);
                        $j("#topMenu").html($j('.moderatorTopMenu', data).html());
                    });
                    break;
                //smthgonnaWrong???!!!...
                default:
                    showMsg("Some unexpected error...");
            }
        }     
    });
    
/* Mmmm .. mb that's all ... Let's do the work! Good luck to us! =)*/
});

function hotkeys(event) {

    if (event.keyCode == 37){
        $j('#left').click();
    }
    if (event.keyCode == 39){
        $j('#right').click();
    }
}
